/**
Node.js 的 events 模块是用于处理事件驱动编程的核心模块。通过该模块，开发者可以创建事件发射器（EventEmitter），注册事件监听器，并发射事件。以下是对 events 模块基本使用的说明和总结：
  1. 引入模块
  首先，需要引入 events 模块：
  const EventEmitter = require('events');
  2. 创建事件发射器
  通过 EventEmitter 类创建一个事件发射器实例：
  const myEmitter = new EventEmitter();
  3. 注册事件监听器
  使用 on 方法注册事件监听器。当指定的事件被发射时，监听器会被调用。
  myEmitter.on('eventName', (arg1, arg2) => {
      console.log(`事件发生了，参数为: ${arg1}, ${arg2}`);
  });
  4. 发射事件
  使用 emit 方法发射事件，所有注册了该事件的监听器都会被调用。
  myEmitter.emit('eventName', '参数1', '参数2');
  5. 一次性事件监听器
  使用 once 方法注册一次性事件监听器，该监听器只会在事件第一次被发射时调用。
  myEmitter.once('onceEvent', () => {
      console.log('这个事件只会处理一次');
  });
  6. 移除事件监听器
  使用 removeListener 或 off 方法移除指定事件的监听器。
  const listener = () => {
      console.log('这是一个监听器');
  };

  myEmitter.on('event', listener);
  myEmitter.removeListener('event', listener);
  7. 移除所有监听器
  使用 removeAllListeners 方法移除指定事件的所有监听器。
  myEmitter.removeAllListeners('event');
  8. 错误处理
  建议始终监听 error 事件，以捕获和处理错误。未处理的错误事件可能导致 Node.js 进程崩溃。
  myEmitter.on('error', (err) => {
      console.error('发生错误:', err);
  });
  9. 示例代码
  以下是一个完整的示例，演示了如何使用 events 模块：
  const EventEmitter = require('events');

  const myEmitter = new EventEmitter();

  // 注册事件监听器
  myEmitter.on('greet', (name) => {
      console.log(`你好，${name}!`);
  });

  // 发射事件
  myEmitter.emit('greet', '小明');

  // 注册一次性事件监听器
  myEmitter.once('welcome', () => {
      console.log('欢迎来到 Node.js 事件模块!');
  });

  // 发射一次性事件
  myEmitter.emit('welcome');
  myEmitter.emit('welcome'); // 这次不会触发
  10. 总结
  Node.js 的 events 模块提供了一种简单而强大的方式来处理事件。通过 EventEmitter，开发者可以轻松地创建和管理事件，构建灵活的事件驱动应用程序。掌握这一模块的基本用法，有助于提高 Node.js 应用的可维护性和可扩展性。
 */
// events模块中的事件总线
const EventEmitter = require("events");

const emitter = new EventEmitter(); // 创建事件总线

function listener(value) {
  console.log("监听到了 emitterEvent 事件", value);
}

emitter.on("emitterEvent", listener);

// 发射事件
setTimeout(() => {
  emitter.emit("emitterEvent", "Hello event emitter");

  // 取消事件监听
  emitter.off("emitterEvent", listener);

  setTimeout(() => {
    emitter.emit("emitterEvent"); // 这次不会触发
  }, 1000);
}, 2000);
